package ec.edu.uce.tour.servicio.catalogo.impl;

import java.util.List;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;

import ec.edu.uce.tour.dao.general.CatalogoDao;
import ec.edu.uce.tour.dao.util.ParametroSentencia;
import ec.edu.uce.tour.dto.CiudadDTO;
import ec.edu.uce.tour.dto.ProvinciasDTO;
import ec.edu.uce.tour.dto.SelectOneListDTO;
import ec.edu.uce.tour.excepcion.AccesoDatosExcepcion;
import ec.edu.uce.tour.excepcion.UceTourException;
import ec.edu.uce.tour.servicio.catalogo.ServicioCatalogos;

@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class ServicioCatalogosBean implements ServicioCatalogos {

	@Inject 
	private CatalogoDao catalogoDao;
	
	@SuppressWarnings("unchecked")
	@Override
	public void guardarCatalogo(Object catalogo) throws UceTourException {
		// TODO Auto-generated method stub
		try{
			catalogoDao.guardar(catalogo);
		}catch(AccesoDatosExcepcion e)
		{
			throw new UceTourException(e.getCause().getLocalizedMessage(), e);
		}
		catch(Throwable e)
		{
			throw new UceTourException("No se puede guardar el dato", e);
		}
	}

	@Override
	public void eliminarCatalogo(Object catalogo) {
		// TODO Auto-generated method stub
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public  void modificarCatalogo(Object catalogo)  throws UceTourException {
		// TODO Auto-generated method stub
		try{
			catalogoDao.actualizar(catalogo);
		}catch(UceTourException e)
		{
			throw new UceTourException(e.getCause().getLocalizedMessage(), e);
		}
		catch(Throwable e)
		{
			throw new UceTourException("No se puede actualizar", e);
		}
	}


	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<SelectOneListDTO> obtenerDatosSelectList(Class<?> nombre, String campoId, String campoValue,String estadoCampo, ParametroSentencia parametro) throws UceTourException
	{
		return catalogoDao.obtenerDatosSelectList(nombre, campoId, campoValue, estadoCampo, parametro);
	}


	@SuppressWarnings("unchecked")
	@Override
	public List<ProvinciasDTO> cargarProvinciasPorPais(Integer idPais)
			throws UceTourException {
		try{
			ParametroSentencia parametro = new ParametroSentencia("idPais",idPais);
			List<ProvinciasDTO> listaProvinciasDTOs = (List<ProvinciasDTO>) this.catalogoDao.buscarPorQuery("ProvinciaTbl.cargarListaProvinciasPorIdPais", Boolean.TRUE, null, parametro);
			return listaProvinciasDTOs;
		}catch(UceTourException e)
		{
			throw new UceTourException(e.getCause().getLocalizedMessage(), e);
		}
		catch(Throwable e)
		{
			throw new UceTourException("No se ha podido cargar las listas para ese pais", e);
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<CiudadDTO> cargarListaProvinciasPorIdPais(Integer idPais)
			throws UceTourException {
		try{
			ParametroSentencia parametro = new ParametroSentencia("idPais",idPais);
			List<CiudadDTO> listaCiudadDTOs = (List<CiudadDTO>) this.catalogoDao.buscarPorQuery("CiudadTbl.cargarListaProvinciasPorIdPais", Boolean.TRUE, null, parametro);
			return listaCiudadDTOs;
		}catch(UceTourException e)
		{
			throw new UceTourException(e.getCause().getLocalizedMessage(), e);
		}
		catch(Throwable e)
		{
			throw new UceTourException("No se ha podido cargar las listas para ese provincia", e);
		}
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<CiudadDTO> cargarListaCiudadesPorIdPais(Integer idPais)
			throws UceTourException {
		try{
			ParametroSentencia parametro = new ParametroSentencia("idPais",idPais);
			List<CiudadDTO> listaCiudadDTOs = (List<CiudadDTO>) this.catalogoDao.buscarPorQuery("CiudadTbl.cargarListaCiudadesPorIdPais", Boolean.TRUE, null, parametro);
			return listaCiudadDTOs;
		}catch(UceTourException e)
		{
			throw new UceTourException(e.getCause().getLocalizedMessage(), e);
		}
		catch(Throwable e)
		{
			throw new UceTourException("No se ha podido cargar las listas para ese ciudades", e);
		}
	}
	
	

	@Override
	@SuppressWarnings({ "unchecked" })
	public <T> List<T> obtenerListaCatalogos(Class<T> nombre)
			throws UceTourException {
		try{
			return (List<T>) catalogoDao.buscarTodo(nombre);
		}catch(UceTourException e)
		{
			throw new UceTourException(e.getCause().getLocalizedMessage(), e);
		}
		catch(Throwable e)
		{
			throw new UceTourException("No se puede guardar el dato", e);
		}
	}

	@Override
	@SuppressWarnings("unchecked")
	public Object cargarCatalogoPorId(Class<?> nombre, Integer idCatalogo)
			throws UceTourException {
		try{
			
		 return	catalogoDao.buscarPorId(nombre, idCatalogo);
		
		}
		catch(UceTourException e)
		{
			throw new UceTourException(e.getCause().getLocalizedMessage(), e);
		}
		catch(Throwable e)
		{
			throw new UceTourException("No se puede el catalogo seleccionado", e);
		}
	}

}
